package com.bt.springboot.demo.algorithm;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 排序算法demo
 *
 * @author zkx
 * @Date 2022/6/17 18:25
 */
@Slf4j
public class SortDemo {

	public static void main(String[] args) {
//		int[] arr = {4, 3, 1, 2, 5};
//
////		bubbleSort(arr);
//		selectSort(arr);
//		log.info(Arrays.toString(arr));
//		List<List<Integer>> lists = generateListGroup(Arrays.asList(1, 2, 3, 4,5), 2);
//		for (List<Integer> list : lists){
//			list.forEach(System.out::print);
//			System.out.println("\n");
//		}

	}

	/**
	 * 处理集合分批存放
	 *
	 * @param list
	 * @param maxListSize
	 * @param <E>
	 * @return
	 */
	public static <E> List<List<E>> generateListGroup(List<E> list, int maxListSize) {
		List<List<E>> listGroup = new ArrayList<>();
		if (CollectionUtils.isEmpty(list) || list.size() <= maxListSize) {
			listGroup.add(list);
		} else {
			int pages = (int) Math.ceil((double) list.size() / (double) maxListSize);
			for (int i = 0; i < pages; i++) {
				int fromIndex = i * maxListSize;
				int toIndex = Math.min((i + 1) * maxListSize, list.size());
				List<E> subList = list.subList(fromIndex, toIndex);
				listGroup.add(subList);
			}
		}
		return listGroup;
	}

	/**
	 * 冒泡排序
	 *
	 * @param arr
	 */
	public static void bubbleSort(int[] arr) {
		int temp;
		//要遍历的次数
		for (int i = 0; i < arr.length - 1; i++) {
			// 从后向前依次比较相邻两个数的大小，遍历一次后，把数组中第i小的数放在第i个位置上
			for (int j = 0; j < arr.length - 1 - i; j++) {
				// 比较相邻的两个
				if (arr[j] > arr[j + 1]) {
					temp = arr[j + 1];
					arr[j + 1] = arr[j];
					arr[j] = temp;
				}
			}
		}
	}

	/**
	 * 选择排序
	 *
	 * @param arr
	 */
	public static void selectSort(int[] arr) {
		// 1.定义一个循环控制选择几轮
		for (int i = 0; i < arr.length - 1; i++) {
			// 遍历后面的元素
			for (int j = i + 1; j < arr.length; j++) {
				// 拿当前位置与j指定的元素进行大小比较，后面的较小就交换位置
				if (arr[j] < arr[i]) {
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
	}

}
